谈谈HashMap、Hashtable和ConcurrenHashMap
坚持 再坚持 总会更加幸运
今天,我们来谈谈HashMap, Hashtable和ConcurrentHashMap在使用上的一些区别。
如果你还不知道HashMap的工作原理,建议看看
先谈谈HashMap和Hashtable的区别
它们两个在工作原理上几乎是一样的。它们两个的区别主要体现在:对键值对的要求、线程的安全性,迭代器的选择以及速度上。
1.对键值对的要求
在进行集合的put(key, value)操作时,对于HashMap来说,它允许key和value的值可以是null。但是,Hashtable则对key和value有要求,不允许key和value为null
2.线程的安全上
HashMap是非同步的(synchronized),这也意味着,HashMap在进行插入、删除等操作的时候,是线程不安全的,如果自己没有在程序上对HashMap进行同步的处理,则不能让多个线程共享一个变量。如下图(没有加同步锁)
但,Hashtable是线程安全的,这也意味着可以在多个线程的环境上,共享一个变量。不过,需要提出的是,Hashtable是在每个方法前面加一个锁的。如下图
使用迭代器上的区别
HashMap的迭代器(Iterator)是使用fail-fast机制的(快速失败机制),而Hashtable的迭代器(enumerator)使用的是fail-safe机制(快速安全)。如果不知道fail-fast与fail-safe,建议看看我的另一片文章:
处理速度上的区别
居然Hashtable在线程安全方面要比HashMap强,那么在其他的方面自然要比它弱。由于Hashtable是线程安全的,同步的,那么在单线程的情况下,它的处理速度是要比HashMap慢的。
但是,就算在多线程环境下,我们也不使用Hashtable,Hashtable的同步锁是加在方法名前面的,意味着它把整个方法的代码都给锁的,所以在处理速度上是特别慢的。所以在多线程的环境下,我们优先使用另一个集合:ConcurrentHashMap,这个集合在工作原理上几乎和前面两个一样,但它是线程安全的,并且它不像Hashtable那样,把整个方法都给加锁,而是在方法里面的关键代码上加同步锁,如图:
所以,它在处理速度上比Hashtable要快,但比HashMap慢,可以说,ConcurrentHashMap是HashMap和Hashtable的折中方案。
下面解释一下什么是同步(synchronization):
假如我们在一个方法前面加了同步锁,那么在多线程的环境下,如果有一个线程1正在执行这个方法里面的代码(也就是所,这个线程获得了同步锁)。那么其他线程则不能进去执行这个方法里面的代码,直到线程1把这个方法里面的代码全部执行完,并且退出这个方法(释放同步锁),那么其他的线程在获得同步锁之后才能执行这个方法。
HashMap的存取原理你知道多少
谈谈fail-fast与fail-safe
感谢你的阅读,希望对你有所帮助
关注我的公众号:苦逼的码农
每天推送技术文章,各种资源以及
每日一题 有关面试的算法题